package com.doraemon.controller.admin;

import com.doraemon.dto.SetmealDTO;
import com.doraemon.dto.SetmealPageQueryDTO;
import com.doraemon.result.PageResult;
import com.doraemon.result.Result;
import com.doraemon.service.SetmealService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.web.bind.annotation.*;
import com.doraemon.vo.SetmealVO;

import java.util.List;

/**
 * 套餐管理Controller
 **/
@RestController
@RequestMapping("/admin/setmeal")
@Slf4j
@Api(tags = "套餐相关接口")
public class SetmealController {

    @Autowired
    private SetmealService setmealService;

    /***
     * 新增套餐
     * -由Spring Cache处理-
     * ---
     * @param setmealDTO 套餐DTO类（前端参数）
     * @return: com.doraemon.result.Result<java.lang.String>
     */
    @PostMapping()
    // 与用户端 list 方法@Cacheable注解指定的缓存名与缓存key保持一致
    @CacheEvict(cacheNames = "setmealCache", key = "#setmealDTO.categoryId")
    @ApiOperation("新增套餐")
    public Result<String> addSetmeal(@RequestBody SetmealDTO setmealDTO) {
        log.info("新增套餐：{}", setmealDTO);

        // 调用Service层 addSetmealWithDish 方法，新增套餐，同时保存套餐与菜品关联关系
        setmealService.addSetmealWithDish(setmealDTO);

        return Result.success();
    }

    /***
     * 批量删除套餐
     * -由Spring Cache处理-
     * ---
     * @param ids 套餐id集合
     * @return: com.doraemon.result.Result<java.lang.String>
     */
    @DeleteMapping()
    @CacheEvict(cacheNames = "setmealCache", allEntries = true) // 删除setmealCache下的所有缓存数据
    @ApiOperation("批量删除套餐")
    public Result<String> deleteSetmeal(@RequestParam List<Long> ids) {
        log.info("批量删除套餐：{}", ids);

        // 调用Service层 deleteBatch 方法，批量删除套餐
        setmealService.deleteBatch(ids);

        return Result.success();
    }

    /***
     * 修改套餐售卖状态
     * -由Spring Cache处理-
     * ---
     * @param status 套餐售卖状态 0 停售 1 起售
     * @param id 套餐id
     * @return: com.doraemon.result.Result<java.lang.String>
     */
    @PostMapping("/status/{status}")
    @CacheEvict(cacheNames = "setmealCache", allEntries = true) // 删除setmealCache下的所有缓存数据
    @ApiOperation("修改套餐售卖状态")
    public Result<String> updateStatus(@PathVariable Integer status, @RequestParam Long id) {
        if (status == 1) {
            log.info("套餐售卖状态修改：ID={}，状态=起售", id);
        } else log.info("套餐售卖状态修改：ID={}，状态=停售", id);

        // 调用Service层 updateStatus 方法，修改菜品售卖状态
        setmealService.updateStatus(status, id);

        return Result.success();
    }

    /***
     * 修改套餐
     * -由Spring Cache处理-
     * ---
     * @param setmealDTO 套餐DTO类（前端参数）
     * @return: com.doraemon.result.Result<java.lang.String>
     */
    @PutMapping()
    @CacheEvict(cacheNames = "setmealCache", allEntries = true) // 删除setmealCache下的所有缓存数据
    @ApiOperation("修改套餐")
    public Result<String> updateSetmeal(@RequestBody SetmealDTO setmealDTO) {
        log.info("修改套餐：{}", setmealDTO);

        // 调用Service层 updateWithDish 方法，修改套餐，同时修改套餐与菜品关联关系
        setmealService.updateWithDish(setmealDTO);

        return Result.success();
    }

    /***
     * 分页查询
     * ---
     * @param setmealPageQueryDTO 套餐分页DTO类
     * @return: com.doraemon.result.Result<com.doraemon.result.PageResult>
     */
    @GetMapping("/page")
    @ApiOperation("套餐分页查询")
    public Result<PageResult> page(SetmealPageQueryDTO setmealPageQueryDTO) {
        log.info("套餐分页查询：页码 {},每页展示 {},名称 {},分类id {},状态 {}",
                setmealPageQueryDTO.getPage(),
                setmealPageQueryDTO.getPageSize(),
                setmealPageQueryDTO.getName(),
                setmealPageQueryDTO.getCategoryId(),
                setmealPageQueryDTO.getStatus());

        // 调用Service层 pageQuery 方法，分页查询套餐
        PageResult pageResult = setmealService.pageQuery(setmealPageQueryDTO);

        return Result.success(pageResult);
    }

    /***
     * 根据id查询套餐
     * ---
     * @param id 套餐id
     * @return: com.doraemon.result.Result<com.doraemon.dto.SetmealDTO> 套餐VO类
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询套餐")
    public Result<SetmealVO> findById(@PathVariable Long id) {
        log.info("根据id查询套餐：{}", id);

        // 调用Service层 getByIdWithDish 方法，获取套餐VO类
        SetmealVO setmealVo = setmealService.getByIdWithDish(id);

        return Result.success(setmealVo);
    }
}
